ヘッダーをスキップ
Oracle TimesTen In-Memory Database SQLリファレンス・ガイド
リリース7.0
E05176-01
  目次へ
目次
索引へ
索引

前へ
前へ
次へ
次へ
 

ALTER TABLE

ALTER TABLE文は、既存の表定義を変更します。

アクセス制御

TimesTenインスタンスでアクセス制御が有効な場合、この文にはDDL権限が必要です。

SQL構文

列の追加:

      ALTER TABLE [Owner.]TableName
      ADD [COLUMN] ColumnName ColumnDataType
            [DEFAULT DefaultVal] [[NOT] INLINE] [UNIQUE] [NULL]

または

      ALTER TABLE [Owner.]TableName
      ADD (ColumnName ColumnDataType
            [DEFAULT DefaultVal] [[NOT] INLINE] [UNIQUE] [NULL] [, ... ] )

列の削除:

      ALTER TABLE [Owner.]TableName
      DROP [COLUMN] ColumnName

または

      ALTER TABLE [Owner.]TableName DROP

      (ColumnName [, ... ] )

外部キーおよびON DELETE CASCADE(オプション)の追加:

      ALTER TABLE [Owner.]TableName
      ADD [CONSTRAINT ForeignKeyName] FOREIGN KEY

          (ColumnName [,...]) REFERENCES RefTableName

               [(ColumnName [,...])] [ON DELETE CASCADE]

外部キーの削除:

      ALTER TABLE [Owner.]TableName
      DROP CONSTRAINT ForeignKeyName

ハッシュ索引のサイズ変更:

      ALTER TABLE [Owner.]TableName
      SET PAGES = {RowPages | CURRENT}

主キーで使用する索引をハッシュ索引に変更:

      ALTER TABLE [Owner.]TableName
      USE HASH INDEX PAGES = {RowPages | CURRENT}

主キーで使用する索引をTツリー索引に変更

      ALTER TABLE [Owner.]TableName
      USE TREE INDEX

列のデフォルト値の変更:

      ALTER TABLE [Owner.]TableName
      MODIFY (ColumnName DEFAULT DefaultVal)

列の一意制約の追加または削除:

     ALTER TABLE Owner.]TableName
     {ADD | DROP} UNIQUE (ColumnName)

NULL値可能な列のデフォルト値をNULLに変更することによるデフォルト値の削除:

     ALTER TABLE [Owner.]TableName
     MODIFY (ColumnName DEFAULT NULL)

LRUエージングの追加:

     ALTER TABLE [Owner.]TableName
     ADD AGING LRU [ON | OFF]

時間ベースのエージングの追加:

     ALTER TABLE [Owner.]TableName
     ADD AGING USE ColumnName LIFETIME num1
               {MINUTE[S] | HOUR[S] | DAY[S]}
                [CYCLE num2 {MINUTE[S] | HOUR[S] | DAY[S] }]
                [ON | OFF]

エージング状態の変更:

     ALTER TABLE [Owner.]TableName
     SET AGING [ON | OFF]

エージングの削除:

     ALTER TABLE [Owner.]TableName
     DROP AGING

LIFETIMEの変更(時間ベースのエージングの場合):

     ALTER TABLE [Owner.]TableName
     SET AGING LIFETIME num1 {MINUTE[S] | HOUR[S] | DAY[S]}

CYCLEの変更(時間ベースのエージングの場合):

     ALTER TABLE [Owner.]TableName
     SET AGING CYCLE num2 {MINUTE[S] | HOUR[S] | DAY[S]}

パラメータ

ALTER TABLE文には、次のパラメータがあります。

[Owner.] TableName
変更する表を指定します。
UNIQUE
ColumnNameの各行の値が一意である必要があることを示します。
MODIFY
指定した列の属性を新しい値に変更します。
DEFAULT [NULL]
列のデフォルト値(DefaultVal)を指定します。NULLを指定すると、列のデフォルト値が削除されます。デフォルト値にSYSDATEを指定した列を追加すると、既存の行の列の値のみが、列が追加された時点のシステム日付になります。デフォルト値がUSER関数の1つである場合、列の値はALTER TABLE文を実行したセッションのユーザーの値になります。
列のデフォルト値を変更しても、既存の行は変更されません。
ColumnName
UNIQUE CONSTRAINTまたはデフォルト値が変更される列の名前です。新しい列に、既存の列または別の新しい列と同じ名前を指定することはできません。
ColumnDataType
追加する列のデータ型です。追加のパラメータが必要なデータ型もあります。指定できるデータ型の詳細は、「データ型」を参照してください。
INLINE |
NOT INLINE
デフォルトでは、宣言された列の長さが128バイトより大きい可変長の列は表外に保存されます。宣言された列の長さが128バイト以下の可変長の列は、表内に保存されます。INLINEおよびNOT INLINEキーワードを使用すると、表を作成するときのデフォルトの動作を無効にすることができます。
CONSTRAINT
削除する外部キーを指定します。オプションで、追加された外部キーの名前をユーザーが指定するように指定します。
ForeignKeyName
追加または削除する外部キーの名前です。すべての外部キーは、ユーザーが名前を指定しなかった場合、デフォルトの名前が割り当てられます。ユーザーが指定した名前またはシステムの名前のいずれかをDROP FOREIGN KEYコマンドで指定できます。
FOREIGN KEY
外部キーを追加または削除するよう指定します。「FOREIGN KEY」を参照してください。
REFERENCES
外部キーが別の表を参照するように指定します。
RefTableName
外部キーが参照する表の名前です。
[ON DELETE
CASCADE]
ON DELETE CASCADE参照アクションを有効にします。指定されている場合、参照先キーの値を含む行が親表から削除されると、依存する外部キーの値を持つ子表の行も削除されます。
USE HASH INDEX PAGES = {RowPages | CURRENT}
主キーにハッシュ索引を使用することを指定します。主キーですでにハッシュ索引を使用している場合、この句はSET PAGES句と同じです。
USE TREE INDEX
主キーにTツリー索引を使用することを指定します。主キーですでにTツリー索引を使用している場合、この句は無視されます。
SET PAGES
表の行ページに想定される数に基づいてハッシュ索引のサイズを変更します。各行ページのデータの行数は、最大256です。この数によって、ハッシュ索引に対して作成されるハッシュ・バケットの数が決まります。最小値は1です。推定した数が小さすぎると、パフォーマンスが悪化します。定数(RowPages)または現在の行ページの数を指定できます。ハッシュ索引とページの詳細は、「列定義」を参照してください。
RowPages
想定される行ページの数です。
CURRENT
現在使用されている行ページの数を使用します。
ADD AGING LRU [ON | OFF]
エージング・ポリシーが定義されていない既存の表に、LRUエージングを追加します。

LRUエージングを使用すると、表の行はLRUポリシーを使用して削除されます。LRUエージングでは、最後に使用されてから長期間経過しているデータが削除され、最近使用されているデータのみがキャッシュに保持されます。使用中のデータ・ストア領域が指定のしきい値を超えると、データは削除されます。ほとんど使用されないデータで占有されていた領域は、LRUエージングによって解放されます。

設定のONまたはOFFは、エージング状態を表しています。

OFFの設定は、LRUエージング・ポリシーは定義されているが、エージング状態は無効であることを示しています。エージング状態がOFFであるため、エージングは自動的に実行されません。ONの設定は、LRUエージング・ポリシーが定義され、エージング状態が有効であることを示しています。エージング状態がONであるため、エージングは自動的に実行されます。デフォルトはONです。

LRUエージングの詳細は、「表のエージング」を参照してください。

LRUエージングについては、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』の表のエージングの実装に関する説明を参照してください。

ADD AGING USE ColumnName...
[ON | OFF]
エージング・ポリシーが定義されていない表に、時間ベースのエージングを追加します。
時間ベースのエージングを使用すると、表の行は、時間ベースのエージング・ポリシーを使用して削除されます。時間ベースのエージングでは、データがキャッシュに保持される存続期間を指定できます。時間の単位は、分、時間または日数で指定します。

時間ベースのエージングを使用するためには、エージング対象の表の列を定義する必要があります。この列の値がSYSDATEから差し引かれ、指定した単位(分、時間、日数)を使用して切り捨てられた後、指定したLIFETIME値との比較が行われます。その結果がLIFETIME値より大きい場合、その行はエージングの対象となります。列は、NULL値不可のTIMESTAMP型として定義します。

タイムスタンプ列の値は、アプリケーションによって更新されます。タイムスタンプ列の値が不明な行がある場合、その行が除去されないようにするには、タイムスタンプ列に大きなデフォルト値を定義します。

ColumnNameは、エージング対象の表に定義したタイムスタンプ列です。

AGING USE句を指定すると、時間ベースのエージング・ポリシーが定義されます。設定のONまたはOFFは、エージング状態を表します。

OFFの設定は、時間ベースのエージング・ポリシーは定義されているが、エージング状態は無効であることを示しています。エージング状態がOFFであるため、エージングは自動的に実行されません。ONの設定は、時間ベースのエージング・ポリシーが定義され、エージング状態が有効であることを示しています。エージング状態がONであるため、エージングは自動的に実行されます。デフォルトはONです。

時間ベースのエージングでは、アプリケーションにスライド期間を指定できます。

時間ベースのエージングの詳細は、「表のエージング」を参照してください。

時間ベースのエージングについては、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』の表のエージングの指定に関する説明を参照してください。

LIFETIME Num1 {MINUTE[S] |HOUR[S]| DAY[S]}
この句は時間ベースのエージング専用です。

LIFETIMEは、データがキャッシュに保持されることが保証される時間です。たとえば、単位時間Num1の間、データがキャッシュに保持されます(単位は分または時間または日数)。つまり、指定されたLIFETIME値を超えた行はエージ・アウト(表から削除)されます。

Num1は、正の整数である必要があります。Num1の値は、行がキャッシュに保持される時間の長さを、分、時間または日数で指定します。

時間の単位の概念がサポートされています。データの存続期間に指定された時間単位は、データがキャッシュに保持される単位時間の長さを表します。たとえば、時間の単位にDAYSを指定した場合、タイムスタンプの日付が同じ日になっているすべての行が同時にエージ・アウトされます。また、時間の単位にHOURSを指定した場合は、タイムスタンプ値の時間が同じ行が、すべて同時にエージ・アウトされます。

したがって、LIFETIMEが3 DAYSの場合は、LIFETIMEが72 HOURS(3×24)の場合やLIFETIMEが432 MINUTES(3×24×60)の場合とは異なります。

DAYSは、週末および祝日を含む1週間のすべての日を表します。

「例5.24」を参照してください。

時間ベースのエージングを表に追加する場合は、ADD AGING USE句の後にLIFETIMEを指定します。LIFETIMEの設定を変更するには、SET AGING句の後にLIFETIME句を指定します。

CYCLE Num2 {MINUTE[S] | HOUR[S] |DAY[S] }
この句は時間ベースのエージング専用です。この句は、データが指定したLIFETIME値を超えているかどうか、その結果エージ・アウト(削除)する必要があるかどうかを確認するために、システムで行をチェックする頻度を示しています。

Num2は正の整定数である必要があります。Num2に0を指定すると、エージングは継続され、エージング・スレッドがスリープ状態になることはありません。

時間ベースのエージングを表に追加する場合、この句はオプションです。CYCLE句を指定しない場合、デフォルト値は5分です。これは、エージングが有効な場合、開始してすぐに、行が5分ごとにチェックされることを意味します。

CYCLEを変更するには、ALTER TABLE... SET AGING CYCLE...を使用します。

SET AGING [ON | OFF]
エージング状態を変更します。エージング・ポリシーが事前に定義されている必要があります。エージング状態をONに変更すると、エージングは自動的に行われます。エージング状態をOFFに変更すると、エージングは自動的に行われません。外部のスケジューラでエージングを制御する場合は、エージングを無効にしてttAgingScheduleNowを起動します。
DROP AGING
エージング・ポリシーを一度定義すると、変更することはできません。エージングを削除してから再定義してください。
SET AGING LIFETIME Num1 {MINUTE[S] | HOUR[S] |
DAY[S] }
時間ベースのエージングのLIFETIMEを変更するには、この句を使用します。
SET AGING CYCLE Num2 {MINUTE[S] | HOUR[S] |DAY[S]}
時間ベースのエージングのCYCLEを変更するには、この句を使用します。

説明

表のエージング

           「例5.25」を参照してください。

     既存の表に時間ベースのエージングを追加:

          ALTER TABLE... ADD AGING USE ...

           「例5.26」を参照してください。

     新規の表にLRUエージングを追加:

          CREATE TABLE... AGING LRU [ON|OFF]

     新規の表に時間ベースのエージングを追加:

          CREATE TABLE... AGING USE....

     新規の表にエージングを定義する方法の詳細は、「CREATE TABLE」を参照してください。

               {MINUTE[S] |HOUR[ S] |DAY[S] }

例5.16

ReturnRateを表Partsに追加します。

ALTER TABLE Parts ADD COLUMN ReturnRate DOUBLE;

例5.17

NumAssignPrevDeptを表Contractorに追加します。

ALTER TABLE Contractor

ADD ( NumAssign INTEGER, PrevDept CHAR(30) );

例5.18

Employeeの列Addr1Addr2を削除します。

ALTER TABLE Employee DROP ( Addr1, Addr2 );

例5.19

次の文では、表BooksのUNIQUEのTitle列を削除します。

ALTER TABLE Books DROP UNIQUE (Title);

例5.20

次の文では、デフォルト値5を使用して列x1を表T1に追加します。

ALTER TABLE T1 ADD (x1 INT DEFAULT 5);

例5.21

次の文では、列のデフォルト値x1を2に変更します。

ALTER TABLE T1 MODIFY (x1 DEFAULT 2);

例5.22

この例では、Tツリー索引およびハッシュ索引の使用方法を示しています。表Pkeyを作成し、Col1を主キーとして定義します。デフォルトでTツリー索引が作成されます。次に、この表をALTER文で変更し、Col1の索引をハッシュ索引に変更します。再度この表をALTER文で変更し、索引をTツリー索引に戻します。

Command> CREATE TABLE Pkey (Col1 TT_INTEGER PRIMARY KEY, Col2 VARCHAR2 (20));

Command> INDEXES Pkey;

Indexes on table SAMPLEUSER.PKEY:

PKEY: unique T-tree index on columns:

COL1

1 index found.

1 table found.

次に、ハッシュ索引を使用するように、Pkey表を変更します。

Command> ALTER TABLE Pkey USE HASH INDEX PAGES = CURRENT;

Command> INDEXES PKEY;

Indexes on table SAMPLEUSER.PKEY:

PKEY: unique hash index on columns:

COL1

1 index found.

1 table found.

次に、Tツリー索引を使用するように、Pkey表を変更します。

Command> ALTER TABLE PKEY USE TREE INDEX;

Command> INDEXES PKEY;

Indexes on table SAMPLEUSER.PKEY:

PKEY: unique T-tree index on columns:

COL1

1 index found.

1 table found.

例5.23

この例では、主キーを使用しないで、列にTツリー索引またはハッシュ索引を定義するように表を変更しようとしたときにエラーが生成されます。

Command> CREATE TABLE IllegalIndex (Col1 CHAR (20));

Command> ALTER TABLE IllegalIndex USE TREE INDEX;

2810: The table has no primary key so cannot change its index type

The command failed.

Command> ALTER TABLE IllegalIndex USE HASH INDEX PAGES = CURRENT;

2810: The table has no primary key so cannot change its index type

The command failed.

例5.24

次の例は、エージングにおいて、時間の単位がどのように機能するかを示しています。

LIFETIMEが3日の場合(日単位):

(SYSDATE - 列値) <= 3の場合、エージ・アウトされません。

(SYSDATE - 列値) >= 3の場合、エージ・アウトの対象となります。

(SYSDATE - 列値) = 3日と22時間の場合:

LIFETIMEを3日に指定した場合、行はエージ・アウトされません。

LIFETIMEを72時間に指定した場合、行はエージ・アウトされます。

例5.25

次の例では、表を変更してLRUエージングを追加します。表には事前に設定されたエージング・ポリシーはありません。エージング状態は、デフォルトでONになっています。

ALTER TABLE AgingDemo3

ADD AGING LRU;

Command> DESCRIBE AgingDemo3;

Table USER.AGINGDEMO3:

Columns:

*AGINGID NUMBER NOT NULL

NAME VARCHAR2 (20) INLINE

Aging lru on

1 table found.

(primary key columns are indicated with *)

例5.26

次の例では、表を変更して時間ベースのエージングを追加します。表には事前に設定されたエージング・ポリシーはありません。AgingColumnはタイムスタンプ列、LIFETIMEは2日、CYCLEは30分です。

ALTER TABLE AgingDemo4

ADD AGING USE AgingColumn LIFETIME 2 DAYS CYCLE 30

MINUTES;

Command> DESCRIBE AgingDemo4;

Table USER.AGINGDEMO4:

Columns:

*AGINGID NUMBER NOT NULL

NAME VARCHAR2 (20) INLINE

AGINGCOLUMN TIMESTAMP (6) NOT NULL

Aging use AGINGCOLUMN lifetime 2 days cycle 30 minutes on

例5.27

次の例では、エラー・メッセージが生成されます。これは、エージング・ポリシーを一度作成すると、変更できないことを示しています。エージングを削除して、再定義する必要があります。

CREATE TABLE AgingDemo5

(AgingId NUMBER NOT NULL PRIMARY KEY

,Name VARCHAR2 (20)

,AgingColumn TIMESTAMP NOT NULL

)

AGING USE AgingColumn LIFETIME 3 DAYS OFF;

ALTER TABLE AgingDemo5

ADD AGING LRU;

2980: Cannot add aging policy to a table with an existing aging policy. Have to drop the old aging first

The command failed.

DROP aging on the table and redefine with LRU aging.

ALTER TABLE AgingDemo5

DROP AGING;

ALTER TABLE AgingDemo5

ADD AGING LRU;

Command> DESCRIBE AgingDemo5;

Table USER.AGINGDEMO5:

Columns:

*AGINGID NUMBER NOT NULL

NAME VARCHAR2 (20) INLINE

AGINGCOLUMN TIMESTAMP (6) NOT NULL

Aging lru on

1 table found.

(primary key columns are indicated with *)

例5.28

次の例では、ALTER文で表のエージング状態をOFFに設定します。表には時間ベースのエージング・ポリシーが定義されています。エージング状態をOFFに設定すると、エージングは自動的には行われません。これは、外部のスケジューラを使用してエージング処理を制御する必要がある場合に有効です。エージング状態をOFFに設定し、ttAgingScheduleNowを起動してエージング処理を開始します。

Command> DESCRIBE AgingDemo4;

Table USER.AGINGDEMO4:

Columns:

*AGINGID NUMBER NOT NULL

NAME VARCHAR2 (20) INLINE

AGINGCOLUMN TIMESTAMP (6) NOT NULL

Aging use AGINGCOLUMN lifetime 2 days cycle 30 minutes on

ALTER TABLE AgingDemo4

SET AGING OFF;

DESCRIBE AgingDemo4を実行すると、エージング・ポリシーが定義されてエージング状態がOFFに設定されることに注意してください。

Command> DESCRIBE AGINGDEMO4;

Table USER.AGINGDEMO4:

Columns:

*AGINGID NUMBER NOT NULL

NAME VARCHAR2 (20) INLINE

AGINGCOLUMN TIMESTAMP (6) NOT NULL

Aging use AGINGCOLUMN lifetime 2 days cycle 30 minutes off

1 table found.

(primary key columns are indicated with *)

次に、ttAgingScheduleNowをコールして、外部スケジューラでエージングを起動します。

Command> call ttAgingScheduleNow ('AgingDemo4');
例5.29

表にタイムスタンプ列を追加し、その列を時間ベースのエージングに使用するように変更してみます。エラーが生成されます。

Command> describe x;

Table USER1.X:

Columns:

*ID TT_INTEGER NOT NULL

1 table found.

(primary key columns are indicated with *)

Command> ALTER TABLE x ADD COLUMN t TIMESTAMP;

Command> ALTER TABLE x ADD AGING USE t LIFETIME 2 DAYS;

2993: Aging column cannot be nullable

The command failed.

関連項目

CREATE TABLE
DROP TABLE